#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生信息的结构体
typedef struct {
    int id;              // 学号
    char name[50];       // 姓名
    float score;         // 成绩
} Student;

// 定义动态学生数组
typedef struct {
    Student *students;   // 学生数组指针
    int count;           // 当前学生数目
    int capacity;        // 数组容量
} StudentArray;

// 初始化学生数组
void initStudentArray(StudentArray *array, int initialCapacity) {
    array->students = (Student *)malloc(initialCapacity * sizeof(Student));
    array->count = 0;
    array->capacity = initialCapacity;
}

// 动态扩展数组容量
void expandStudentArray(StudentArray *array) {
    array->capacity *= 2;
    array->students = (Student *)realloc(array->students, array->capacity * sizeof(Student));
}

// 添加学生信息
void addStudent(StudentArray *array) {
    if (array->count == array->capacity) {
        expandStudentArray(array);
    }

    Student student;
    printf("输入学生学号: ");
    scanf("%d", &student.id);
    printf("输入学生姓名: ");
    scanf("%s", student.name);
    printf("输入学生成绩: ");
    scanf("%f", &student.score);

    array->students[array->count++] = student;
    printf("学生信息已添加！\n");
}

// 删除学生信息
void deleteStudent(StudentArray *array) {
    int id;
    printf("输入要删除的学生学号: ");
    scanf("%d", &id);

    for (int i = 0; i < array->count; i++) {
        if (array->students[i].id == id) {
            for (int j = i; j < array->count - 1; j++) {
                array->students[j] = array->students[j + 1];
            }
            array->count--;
            printf("学生信息已删除！\n");
            return;
        }
    }
    printf("未找到对应学号的学生！\n");
}

// 显示所有学生信息
void displayStudents(const StudentArray *array) {
    if (array->count == 0) {
        printf("当前没有学生信息。\n");
        return;
    }

    printf("\n所有学生信息:\n");
    printf("学号\t姓名\t成绩\n");
    for (int i = 0; i < array->count; i++) {
        printf("%d\t%s\t%.2f\n", array->students[i].id, array->students[i].name, array->students[i].score);
    }
}

// 查询学生成绩
void searchStudent(const StudentArray *array) {
    int id;
    printf("输入要查询的学生学号: ");
    scanf("%d", &id);

    for (int i = 0; i < array->count; i++) {
        if (array->students[i].id == id) {
            printf("学生信息:\n");
            printf("学号: %d\n", array->students[i].id);
            printf("姓名: %s\n", array->students[i].name);
            printf("成绩: %.2f\n", array->students[i].score);
            return;
        }
    }
    printf("未找到对应学号的学生！\n");
}

// 主函数
int main() {
    StudentArray array;
    initStudentArray(&array, 5);

    int choice;
    do {
        printf("\n学生成绩管理系统\n");
        printf("1. 添加学生\n");
        printf("2. 删除学生\n");
        printf("3. 显示所有学生\n");
        printf("4. 查询学生成绩\n");
        printf("5. 退出\n");
        printf("选择操作: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                addStudent(&array);
                break;
            case 2:
                deleteStudent(&array);
                break;
            case 3:
                displayStudents(&array);
                break;
            case 4:
                searchStudent(&array);
                break;
            case 5:
                printf("退出系统。\n");
                break;
            default:
                printf("无效选择，请重新输入。\n");
        }
    } while (choice != 5);

    // 释放内存
    free(array.students);
    return 0;
}
